<!DOCTYPE html>
<html lang="en">
<head>
  <meta charset="UTF-8">
  <meta http-equiv="X-UA-Compatible" content="IE=edge">
  <meta name="viewport" content="width=device-width, initial-scale=1.0">
  <title>Document</title>
</head>
<body>
  <script>

    /* 
  - 变量到底是什么?
    - 可以变化的量, 由变量名和变量值组成, 名称是标识, 值是可以变化的
    - 一个变量对应一块小内存, 变量名是这块内存的标识名称, 用于查找这块内存, 变量的值就是内存中保存的数据
  - 基本类型变量与引用类型变量的区别是什么?
    - 根据变量内存中保存的数据来区分
    - 基本类型变量: 内存中保存的基本类型的数据
    - 引用类型变量: 内存中保存的是地址值
  - 给变量赋值到底做了什么?
    - 将基本类型数据赋给变量: 将数据保存在变量内存中
    - 将对象赋给变量: 将对象在内存中的地址值保存在变量内存中
    - 将另一个变量赋给变量: 将右侧变量内存中的数据(基本数据/地址值数据)拷贝保存到左侧变量内存
  - 函数传参, 到底是值传递还是引用传递? 
    - 函数调用时, 是将实参变量的数据拷贝一份赋值给形参变量
    - 只是实参变量数据可能是基本类型, 也可能是引用类型的(地址值)
  - 有哪些改变变量值的方式?
    - 只能通过赋值改变
    - c.m = 2: 改的是c变量指向的对象内部的属性数据, c本身没有变化的(对象内存的位置没变)
  - 如何理解下面2句重要的话(编码演示说明)?
    - 2个引用变量指向同一个对象, 如果通过一个变量修改对象内部的数据 => 另一个变量也能看到原对象(新数据)
    - 2个引用变量指向同一个对象, 让其中一个变量指向一个新的对象 => 另一个引用变量看到的是老的对象
  */
    // var a = 3
    // var b = {m: 1}
    // console.log(b.m)
    // /* 基本类型的数据查找: 根据变量名称, 对象的查找是根据地址值查找的 */
    // var c = a // 将a中保存的数据(基本数据)保存到c内存中
    // c = b  // 将b中保存的数据(地址值)保存到c内存中

    // function fn(d) {
      
    // }
    // fn(a)  // d = a
    // fn(b) // d = b
    // b.m = 2
/* ********** */

    // - 2个引用变量指向同一个对象, 如果通过一个变量修改对象内部的数据 => 另一个变量也能看到原对象(新数据)
    // const a = {m: 1}
    // const b = a
    // a.m = 2
    // console.log(b.m) // 2


    // - 2个引用变量指向同一个对象, 让其中一个变量指向一个新的对象 => 另一个引用变量看到的是老的对象
    // const a = {m: 1}
    // const b = a
    // a = {m: 2}
    // console.log(a.m, b.m) // 2 1

    // var a = {m: 1}
    // var b = a
    // function fn(a) {
    //   // a = {m: 2} // 1 1
    //   a.m = 3  // 3 3
    // }
    // fn(a)
    // console.log(a.m, b.m) 


    function fn(a) {
      
    }
    var m = 3
    fn(m)  // a = m  ==> 值传递

    var n = {m: 1}
    fn(n) // a = n  ==> 传递的是n内存中保存的地址值, 而不是它本身的地址值



  </script>
</body>
</html>